home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / cmds / tcsh / dist / ed.term.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-21  |  25.0 KB  |  1,100 lines

  1. /* $Header: /home/hyperion/mu/christos/src/sys/tcsh-6.01/RCS/ed.term.c,v 1.8 1991/12/19 22:34:14 christos Exp $ */
  2. /*
  3.  * ed.term.c: Low level terminal interface
  4.  */
  5. /*-
  6.  * Copyright (c) 1980, 1991 The Regents of the University of California.
  7.  * All rights reserved.
  8.  *
  9.  * Redistribution and use in source and binary forms, with or without
  10.  * modification, are permitted provided that the following conditions
  11.  * are met:
  12.  * 1. Redistributions of source code must retain the above copyright
  13.  *    notice, this list of conditions and the following disclaimer.
  14.  * 2. Redistributions in binary form must reproduce the above copyright
  15.  *    notice, this list of conditions and the following disclaimer in the
  16.  *    documentation and/or other materials provided with the distribution.
  17.  * 3. All advertising materials mentioning features or use of this software
  18.  *    must display the following acknowledgement:
  19.  *    This product includes software developed by the University of
  20.  *    California, Berkeley and its contributors.
  21.  * 4. Neither the name of the University nor the names of its contributors
  22.  *    may be used to endorse or promote products derived from this software
  23.  *    without specific prior written permission.
  24.  *
  25.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  26.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  27.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  28.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  29.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  30.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  31.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  32.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  33.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  34.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  35.  * SUCH DAMAGE.
  36.  */
  37. #include "sh.h"
  38.  
  39. RCSID("$Id: ed.term.c,v 1.8 1991/12/19 22:34:14 christos Exp $")
  40.  
  41. #include "ed.h"
  42. #include "ed.term.h"
  43.  
  44. int didsetty = 0;
  45. ttyperm_t ttylist = {   
  46.     {
  47. #if defined(POSIX) || defined(TERMIO)
  48.     { "iflag:", ICRNL, (INLCR|IGNCR) },
  49.     { "oflag:", (OPOST|ONLCR), ONLRET },
  50.     { "cflag:", 0, 0 },
  51.     { "lflag:", (ISIG|ICANON|ECHO|ECHOE|ECHOCTL|IEXTEN),
  52.             (NOFLSH|ECHONL|EXTPROC|FLUSHO) },
  53. #else /* GSTTY */
  54.     { "nrmal:", (ECHO|CRMOD|ANYP), (CBREAK|RAW|LCASE|VTDELAY|ALLDELAY) },
  55.     { "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) },
  56. #endif /* TERMIO */
  57.     { "chars:",     0, 0 },
  58.     },
  59.     {
  60. #ifdef TERMIO
  61.     { "iflag:", (INLCR|ICRNL), IGNCR },
  62.     { "oflag:", (OPOST|ONLCR), ONLRET },
  63.     { "cflag:", 0, 0 },
  64.     { "lflag:", ISIG,
  65.             (NOFLSH|ICANON|ECHO|ECHOK|ECHONL|EXTPROC|IEXTEN|FLUSHO) },
  66. #else /* GSTTY */
  67.     { "nrmal:", (CBREAK|CRMOD|ANYP), (RAW|ECHO|LCASE|VTDELAY|ALLDELAY) },
  68.     { "local:", (LCRTBS|LCRTERA|LCRTKIL), (LPRTERA|LFLUSHO) },
  69. #endif /* TERMIO */
  70.     { "chars:", (C_SH(C_MIN)|C_SH(C_TIME)|C_SH(C_SWTCH)|C_SH(C_DSWTCH)|
  71.              C_SH(C_WERASE)|C_SH(C_REPRINT)|C_SH(C_SUSP)|C_SH(C_DSUSP)|
  72.              C_SH(C_EOF)|C_SH(C_EOL)|C_SH(C_DISCARD)|C_SH(C_PGOFF)|
  73.              C_SH(C_KILL2)|C_SH(C_PAGE)|C_SH(C_STATUS)|C_SH(C_LNEXT)), 
  74.              0 }
  75.     },
  76.     {
  77. #ifdef TERMIO
  78.     { "iflag:", 0, IXON | IXOFF },
  79.     { "oflag:", 0, 0 },
  80.     { "cflag:", 0, 0 },
  81.     { "lflag:", 0, ISIG | IEXTEN },
  82. #else /* GSTTY */
  83.     { "nrmal:", RAW, CBREAK },
  84.     { "local:", 0, 0 },
  85. #endif /* TERMIO */
  86.     { "chars:", 0, 0 },
  87.     }
  88. };
  89.  
  90. static struct tcshmodes {
  91.     char *m_name;
  92.     int   m_value;
  93.     int   m_type;
  94. } modelist[] = {
  95. #ifdef TERMIO
  96.  
  97. # ifdef    IGNBRK
  98.     { "ignbrk",    IGNBRK,    M_INPUT },
  99. # endif /* IGNBRK */
  100. # ifdef    BRKINT
  101.     { "brkint",    BRKINT,    M_INPUT },
  102. # endif /* BRKINT */
  103. # ifdef    IGNPAR
  104.     { "ignpar",    IGNPAR,    M_INPUT },
  105. # endif /* IGNPAR */
  106. # ifdef    PARMRK
  107.     { "parmrk",    PARMRK,    M_INPUT },
  108. # endif /* PARMRK */
  109. # ifdef    INPCK
  110.     { "inpck",    INPCK,    M_INPUT },
  111. # endif /* INPCK */
  112. # ifdef    ISTRIP
  113.     { "istrip",    ISTRIP,    M_INPUT },
  114. # endif /* ISTRIP */
  115. # ifdef    INLCR
  116.     { "inlcr",    INLCR,    M_INPUT },
  117. # endif /* INLCR */
  118. # ifdef    IGNCR
  119.     { "igncr",    IGNCR,    M_INPUT },
  120. # endif /* IGNCR */
  121. # ifdef    ICRNL
  122.     { "icrnl",    ICRNL,    M_INPUT },
  123. # endif /* ICRNL */
  124. # ifdef    IUCLC
  125.     { "iuclc",    IUCLC,    M_INPUT },
  126. # endif /* IUCLC */
  127. # ifdef    IXON
  128.     { "ixon",    IXON,    M_INPUT },
  129. # endif /* IXON */
  130. # ifdef    IXANY
  131.     { "ixany",    IXANY,    M_INPUT },
  132. # endif /* IXANY */
  133. # ifdef    IXOFF
  134.     { "ixoff",    IXOFF,    M_INPUT },
  135. # endif /* IXOFF */
  136. # ifdef  IMAXBEL
  137.     { "imaxbel",IMAXBEL,M_INPUT },
  138. # endif /* IMAXBEL */
  139.  
  140. # ifdef    OPOST
  141.     { "opost",    OPOST,    M_OUTPUT },
  142. # endif /* OPOST */
  143. # ifdef    OLCUC
  144.     { "olcuc",    OLCUC,    M_OUTPUT },
  145. # endif /* OLCUC */
  146. # ifdef    ONLCR
  147.     { "onlcr",    ONLCR,    M_OUTPUT },
  148. # endif /* ONLCR */
  149. # ifdef    OCRNL
  150.     { "ocrnl",    OCRNL,    M_OUTPUT },
  151. # endif /* OCRNL */
  152. # ifdef    ONOCR
  153.     { "onocr",    ONOCR,    M_OUTPUT },
  154. # endif /* ONOCR */
  155. # ifdef ONOEOT
  156.     { "onoeot",    ONOEOT,    M_OUTPUT },
  157. # endif /* ONOEOT */
  158. # ifdef    ONLRET
  159.     { "onlret",    ONLRET,    M_OUTPUT },
  160. # endif /* ONLRET */
  161. # ifdef    OFILL
  162.     { "ofill",    OFILL,    M_OUTPUT },
  163. # endif /* OFILL */
  164. # ifdef    OFDEL
  165.     { "ofdel",    OFDEL,    M_OUTPUT },
  166. # endif /* OFDEL */
  167. # ifdef    NLDLY
  168.     { "nldly",    NLDLY,    M_OUTPUT },
  169. # endif /* NLDLY */
  170. # ifdef    CRDLY
  171.     { "crdly",    CRDLY,    M_OUTPUT },
  172. # endif /* CRDLY */
  173. # ifdef    TABDLY
  174.     { "tabdly",    TABDLY,    M_OUTPUT },
  175. # endif /* TABDLY */
  176. # ifdef    XTABS
  177.     { "xtabs",    XTABS,    M_OUTPUT },
  178. # endif /* XTABS */
  179. # ifdef    BSDLY
  180.     { "bsdly",    BSDLY,    M_OUTPUT },
  181. # endif /* BSDLY */
  182. # ifdef    VTDLY
  183.     { "vtdly",    VTDLY,    M_OUTPUT },
  184. # endif /* VTDLY */
  185. # ifdef    FFDLY
  186.     { "ffdly",    FFDLY,    M_OUTPUT },
  187. # endif /* FFDLY */
  188. # ifdef    PAGEOUT
  189.     { "pageout",PAGEOUT,M_OUTPUT },
  190. # endif /* PAGEOUT */
  191. # ifdef    WRAP
  192.     { "wrap",    WRAP,    M_OUTPUT },
  193. # endif /* WRAP */
  194.  
  195. # ifdef    CIGNORE
  196.     { "cignore",CIGNORE,M_CONTROL },
  197. # endif /* CBAUD */
  198. # ifdef    CBAUD
  199.     { "cbaud",    CBAUD,    M_CONTROL },
  200. # endif /* CBAUD */
  201. # ifdef    CSTOPB
  202.     { "cstopb",    CSTOPB,    M_CONTROL },
  203. # endif /* CSTOPB */
  204. # ifdef    CREAD
  205.     { "cread",    CREAD,    M_CONTROL },
  206. # endif /* CREAD */
  207. # ifdef    PARENB
  208.     { "parenb",    PARENB,    M_CONTROL },
  209. # endif /* PARENB */
  210. # ifdef    PARODD
  211.     { "parodd",    PARODD,    M_CONTROL },
  212. # endif /* PARODD */
  213. # ifdef    HUPCL
  214.     { "hupcl",    HUPCL,    M_CONTROL },
  215. # endif /* HUPCL */
  216. # ifdef    CLOCAL
  217.     { "clocal",    CLOCAL,    M_CONTROL },
  218. # endif /* CLOCAL */
  219. # ifdef    LOBLK
  220.     { "loblk",    LOBLK,    M_CONTROL },
  221. # endif /* LOBLK */
  222. # ifdef    CIBAUD
  223.     { "cibaud",    CIBAUD,    M_CONTROL },
  224. # endif /* CIBAUD */
  225. # ifdef CRTSCTS
  226. #  ifdef CCTS_OFLOW
  227.     { "ccts_oflow",CCTS_OFLOW,M_CONTROL },
  228. #  else
  229.     { "crtscts",CRTSCTS,M_CONTROL },
  230. #  endif /* CCTS_OFLOW */
  231. # endif /* CRTSCTS */
  232. # ifdef CRTS_IFLOW
  233.     { "crts_iflow",CRTS_IFLOW,M_CONTROL },
  234. # endif /* CRTS_IFLOW */
  235. # ifdef MDMBUF
  236.     { "mdmbuf",    MDMBUF,    M_CONTROL },
  237. # endif /* MDMBUF */
  238. # ifdef RCV1EN
  239.     { "rcv1en",    RCV1EN,    M_CONTROL },
  240. # endif /* RCV1EN */
  241. # ifdef XMT1EN
  242.     { "xmt1en",    XMT1EN,    M_CONTROL },
  243. # endif /* XMT1EN */
  244.  
  245. # ifdef    ISIG
  246.     { "isig",    ISIG,    M_LINED },
  247. # endif /* ISIG */
  248. # ifdef    ICANON
  249.     { "icanon",    ICANON,    M_LINED },
  250. # endif /* ICANON */
  251. # ifdef    XCASE
  252.     { "xcase",    XCASE,    M_LINED },
  253. # endif /* XCASE */
  254. # ifdef    ECHO
  255.     { "echo",    ECHO,    M_LINED },
  256. # endif /* ECHO */
  257. # ifdef    ECHOE
  258.     { "echoe",    ECHOE,    M_LINED },
  259. # endif /* ECHOE */
  260. # ifdef    ECHOK
  261.     { "echok",    ECHOK,    M_LINED },
  262. # endif /* ECHOK */
  263. # ifdef    ECHONL
  264.     { "echonl",    ECHONL,    M_LINED },
  265. # endif /* ECHONL */
  266. # ifdef    NOFLSH
  267.     { "noflsh",    NOFLSH,    M_LINED },
  268. # endif /* NOFLSH */
  269. # ifdef    TOSTOP
  270.     { "tostop",    TOSTOP,    M_LINED },
  271. # endif /* TOSTOP */
  272. # ifdef    ECHOCTL
  273.     { "echoctl",ECHOCTL,M_LINED },
  274. # endif /* ECHOCTL */
  275. # ifdef    ECHOPRT
  276.     { "echoprt",ECHOPRT,M_LINED },
  277. # endif /* ECHOPRT */
  278. # ifdef    ECHOKE
  279.     { "echoke",    ECHOKE,    M_LINED },
  280. # endif /* ECHOKE */
  281. # ifdef    DEFECHO
  282.     { "defecho",DEFECHO,M_LINED },
  283. # endif /* DEFECHO */
  284. # ifdef    FLUSHO
  285.     { "flusho",    FLUSHO,    M_LINED },
  286. # endif /* FLUSHO */
  287. # ifdef    PENDIN
  288.     { "pendin",    PENDIN,    M_LINED },
  289. # endif /* PENDIN */
  290. # ifdef    IEXTEN
  291.     { "iexten",    IEXTEN,    M_LINED },
  292. # endif /* IEXTEN */
  293. # ifdef    NOKERNINFO
  294.     { "nokerninfo",NOKERNINFO,M_LINED },
  295. # endif /* NOKERNINFO */
  296. # ifdef    ALTWERASE
  297.     { "altwerase",ALTWERASE,M_LINED },
  298. # endif /* ALTWERASE */
  299. # ifdef    EXTPROC
  300.     { "extproc",EXTPROC,M_LINED },
  301. # endif /* EXTPROC */
  302.  
  303. #else /* GSTTY */
  304.  
  305. # ifdef    TANDEM
  306.     { "tandem",    TANDEM,    M_CONTROL },
  307. # endif /* TANDEM */
  308. # ifdef    CBREAK
  309.     { "cbreak",    CBREAK,    M_CONTROL },
  310. # endif /* CBREAK */
  311. # ifdef    LCASE
  312.     { "lcase",    LCASE,    M_CONTROL },
  313. # endif /* LCASE */
  314. # ifdef    ECHO
  315.     { "echo",    ECHO,    M_CONTROL },
  316. # endif /* ECHO */    
  317. # ifdef    CRMOD
  318.     { "crmod",    CRMOD,    M_CONTROL },
  319. # endif /* CRMOD */
  320. # ifdef    RAW
  321.     { "raw",    RAW,    M_CONTROL },
  322. # endif /* RAW */
  323. # ifdef    ODDP
  324.     { "oddp",    ODDP,    M_CONTROL },
  325. # endif /* ODDP */
  326. # ifdef    EVENP
  327.     { "evenp",    EVENP,    M_CONTROL },
  328. # endif /* EVENP */
  329. # ifdef    ANYP
  330.     { "anyp",    ANYP,    M_CONTROL },
  331. # endif /* ANYP */
  332. # ifdef    NLDELAY
  333.     { "nldelay",NLDELAY,M_CONTROL },
  334. # endif /* NLDELAY */
  335. # ifdef    TBDELAY
  336.     { "tbdelay",TBDELAY,M_CONTROL },
  337. # endif /* TBDELAY */
  338. # ifdef    XTABS
  339.     { "xtabs",    XTABS,    M_CONTROL },
  340. # endif /* XTABS */
  341. # ifdef    CRDELAY
  342.     { "crdelay",CRDELAY,M_CONTROL },
  343. # endif /* CRDELAY */
  344. # ifdef    VTDELAY
  345.     { "vtdelay",VTDELAY,M_CONTROL },
  346. # endif /* VTDELAY */
  347. # ifdef    BSDELAY
  348.     { "bsdelay",BSDELAY,M_CONTROL },
  349. # endif /* BSDELAY */
  350. # ifdef    CRTBS
  351.     { "crtbs",    CRTBS,    M_CONTROL },
  352. # endif /* CRTBS */
  353. # ifdef    PRTERA
  354.     { "prtera",    PRTERA,    M_CONTROL },
  355. # endif /* PRTERA */
  356. # ifdef    CRTERA
  357.     { "crtera",    CRTERA,    M_CONTROL },
  358. # endif /* CRTERA */
  359. # ifdef    TILDE
  360.     { "tilde",    TILDE,    M_CONTROL },
  361. # endif /* TILDE */
  362. # ifdef    MDMBUF
  363.     { "mdmbuf",    MDMBUF,    M_CONTROL },
  364. # endif /* MDMBUF */
  365. # ifdef    LITOUT
  366.     { "litout",    LITOUT,    M_CONTROL },
  367. # endif /* LITOUT */
  368. # ifdef    TOSTOP
  369.     { "tostop",    TOSTOP,    M_CONTROL },
  370. # endif /* TOSTOP */
  371. # ifdef    FLUSHO
  372.     { "flusho",    FLUSHO,    M_CONTROL },
  373. # endif /* FLUSHO */
  374. # ifdef    NOHANG
  375.     { "nohang",    NOHANG,    M_CONTROL },
  376. # endif /* NOHANG */
  377. # ifdef    L001000
  378.     { "l001000",L001000,M_CONTROL },
  379. # endif /* L001000 */
  380. # ifdef    CRTKIL
  381.     { "crtkil",    CRTKIL,    M_CONTROL },
  382. # endif /* CRTKIL */
  383. # ifdef    PASS8
  384.     { "pass8",    PASS8,    M_CONTROL },
  385. # endif /* PASS8 */
  386. # ifdef    CTLECH
  387.     { "ctlech",    CTLECH,    M_CONTROL },
  388. # endif /* CTLECH */
  389. # ifdef    PENDIN
  390.     { "pendin",    PENDIN,    M_CONTROL },
  391. # endif /* PENDIN */
  392. # ifdef    DECCTQ
  393.     { "decctq",    DECCTQ,    M_CONTROL },
  394. # endif /* DECCTQ */
  395. # ifdef    NOFLSH
  396.     { "noflsh",    NOFLSH,    M_CONTROL },
  397. # endif /* NOFLSH */
  398.  
  399. # ifdef    LCRTBS
  400.     { "lcrtbs",    LCRTBS,    M_LOCAL },
  401. # endif /* LCRTBS */
  402. # ifdef    LPRTERA
  403.     { "lprtera",LPRTERA,M_LOCAL },
  404. # endif /* LPRTERA */
  405. # ifdef    LCRTERA
  406.     { "lcrtera",LCRTERA,M_LOCAL },
  407. # endif /* LCRTERA */
  408. # ifdef    LTILDE
  409.     { "ltilde",    LTILDE,    M_LOCAL },
  410. # endif /* LTILDE */
  411. # ifdef    LMDMBUF
  412.     { "lmdmbuf",LMDMBUF,M_LOCAL },
  413. # endif /* LMDMBUF */
  414. # ifdef    LLITOUT
  415.     { "llitout",LLITOUT,M_LOCAL },
  416. # endif /* LLITOUT */
  417. # ifdef    LTOSTOP
  418.     { "ltostop",LTOSTOP,M_LOCAL },
  419. # endif /* LTOSTOP */
  420. # ifdef    LFLUSHO
  421.     { "lflusho",LFLUSHO,M_LOCAL },
  422. # endif /* LFLUSHO */
  423. # ifdef    LNOHANG
  424.     { "lnohang",LNOHANG,M_LOCAL },
  425. # endif /* LNOHANG */
  426. # ifdef    LCRTKIL
  427.     { "lcrtkil",LCRTKIL,M_LOCAL },
  428. # endif /* LCRTKIL */
  429. # ifdef    LPASS8
  430.     { "lpass8",    LPASS8,    M_LOCAL },
  431. # endif /* LPASS8 */    
  432. # ifdef    LCTLECH
  433.     { "lctlech",LCTLECH,M_LOCAL },
  434. # endif /* LCTLECH */
  435. # ifdef    LPENDIN
  436.     { "lpendin",LPENDIN,M_LOCAL },
  437. # endif /* LPENDIN */
  438. # ifdef    LDECCTQ
  439.     { "ldecctq",LDECCTQ,M_LOCAL },
  440. # endif /* LDECCTQ */
  441. # ifdef    LNOFLSH
  442.     { "lnoflsh",LNOFLSH,M_LOCAL },
  443. # endif /* LNOFLSH */
  444.  
  445. #endif /* TERMIO */
  446. # if defined(VINTR) || defined(TIOCGETC)
  447.     { "intr",        C_SH(C_INTR),     M_CHAR },
  448. # endif /* VINTR */
  449. # if defined(VQUIT) || defined(TIOCGETC)
  450.     { "quit",        C_SH(C_QUIT),     M_CHAR },
  451. # endif /* VQUIT */
  452. # if defined(VERASE) || defined(TIOCGETP)
  453.     { "erase",        C_SH(C_ERASE),     M_CHAR },
  454. # endif /* VERASE */
  455. # if defined(VKILL) || defined(TIOCGETP)
  456.     { "kill",        C_SH(C_KILL),     M_CHAR },
  457. # endif /* VKILL */
  458. # if defined(VEOF) || defined(TIOCGETC)
  459.     { "eof",        C_SH(C_EOF),     M_CHAR },
  460. # endif /* VEOF */
  461. # if defined(VEOL)
  462.     { "eol",        C_SH(C_EOL),     M_CHAR },
  463. # endif /* VEOL */
  464. # if defined(VEOL2)
  465.     { "eol2",        C_SH(C_EOL2),     M_CHAR },
  466. # endif  /* VEOL2 */
  467. # if defined(VSWTCH)
  468.     { "swtch",        C_SH(C_SWTCH),     M_CHAR },
  469. # endif /* VSWTCH */
  470. # if defined(VDSWTCH)
  471.     { "dswtch",        C_SH(C_DSWTCH),    M_CHAR },
  472. # endif /* VDSWTCH */
  473. # if defined(VERASE2)
  474.     { "erase2",        C_SH(C_ERASE2),    M_CHAR },
  475. # endif /* VERASE2 */
  476. # if defined(VSTART) || defined(TIOCGETC)
  477.     { "start",        C_SH(C_START),     M_CHAR },
  478. # endif /* VSTART */
  479. # if defined(VSTOP) || defined(TIOCGETC)
  480.     { "stop",        C_SH(C_STOP),     M_CHAR },
  481. # endif /* VSTOP */
  482. # if defined(VWERASE) || defined(TIOCGLTC)
  483.     { "werase",        C_SH(C_WERASE),    M_CHAR },
  484. # endif /* VWERASE */
  485. # if defined(VSUSP) || defined(TIOCGLTC)
  486.     { "susp",        C_SH(C_SUSP),     M_CHAR },
  487. # endif /* VSUSP */
  488. # if defined(VDSUSP) || defined(TIOCGLTC)
  489.     { "dsusp",        C_SH(C_DSUSP),     M_CHAR },
  490. # endif /* VDSUSP */
  491. # if defined(VREPRINT) || defined(TIOCGLTC)
  492.     { "reprint",    C_SH(C_REPRINT),M_CHAR },
  493. # endif /* WREPRINT */
  494. # if defined(VDISCARD) || defined(TIOCGLTC)
  495.     { "discard",    C_SH(C_DISCARD),M_CHAR },
  496. # endif /* VDISCARD */
  497. # if defined(VLNEXT) || defined(TIOCGLTC)
  498.     { "lnext",        C_SH(C_LNEXT),     M_CHAR },
  499. # endif /* VLNEXT */
  500. # if defined(VSTATUS) || defined(TIOCGPAGE)
  501.     { "status",        C_SH(C_STATUS),    M_CHAR },
  502. # endif /* VSTATUS */
  503. # if defined(VPAGE) || defined(TIOCGPAGE)
  504.     { "page",        C_SH(C_PAGE),     M_CHAR },
  505. # endif /* VPAGE */
  506. # if defined(VPGOFF) || defined(TIOCGPAGE)
  507.     { "pgoff",        C_SH(C_PGOFF),     M_CHAR },
  508. # endif /* VPGOFF */
  509. # if defined(VKILL2) 
  510.     { "kill2",        C_SH(C_KILL2),     M_CHAR },
  511. # endif /* VKILL2 */
  512. # if defined(VBRK) || defined(TIOCGETC)
  513.     { "brk",        C_SH(C_BRK),     M_CHAR },
  514. # endif /* VBRK */
  515. # if defined(VMIN)
  516.     { "min",        C_SH(C_MIN),     M_CHAR },
  517. # endif /* VMIN */
  518. # if defined(VTIME)
  519.     { "time",        C_SH(C_TIME),     M_CHAR },
  520. # endif /* VTIME */
  521.     { NULL, 0, -1 },
  522. };
  523.  
  524. /*ARGSUSED*/
  525. void
  526. dosetty(v, t)
  527.     Char **v;
  528.     struct command *t;
  529. {
  530.     struct tcshmodes *m;
  531.     char x, *d;
  532.     int aflag = 0;
  533.     Char *s;
  534.     int z = EX_IO;
  535.     char cmdname[BUFSIZE];
  536.  
  537.     setname(strcpy(cmdname, short2str(*v++)));
  538.  
  539.     while (v && *v && v[0][0] == '-' && v[0][2] == '\0') 
  540.     switch (v[0][1]) {
  541.     case 'a':
  542.         aflag++;
  543.         v++;
  544.         break;
  545.     case 'd':
  546.         v++;
  547.         z = ED_IO;
  548.         break;
  549.     case 'x':
  550.         v++;
  551.         z = EX_IO;
  552.         break;
  553.     case 'q':
  554.         v++;
  555.         z = QU_IO;
  556.         break;
  557.     default:
  558.         stderror(ERR_NAME | ERR_SYSTEM, short2str(v[0]), 
  559.              "Unknown switch");
  560.         break;
  561.     }
  562.  
  563.     didsetty = 1;
  564.     if (!v || !*v) {
  565.     int i = -1;
  566.     int len = 0, st = 0, cu;
  567.     for (m = modelist; m->m_name; m++) {
  568.         if (m->m_type != i) {
  569.         xprintf("%s%s", i != -1 ? "\n" : "", 
  570.             ttylist[z][m->m_type].t_name);
  571.         i = m->m_type;
  572.         st = len = strlen(ttylist[z][m->m_type].t_name);
  573.         }
  574.  
  575.         x = (ttylist[z][i].t_setmask & m->m_value) ? '+' : '\0';
  576.         x = (ttylist[z][i].t_clrmask & m->m_value) ? '-' : x;
  577.  
  578.         if (x != '\0' || aflag) {
  579.         cu = strlen(m->m_name) + (x != '\0') + 1;
  580.         if (len + cu >= T_Cols) {
  581.             xprintf("\n%*s", st, "");
  582.             len = st + cu;
  583.         }
  584.         else 
  585.             len += cu;
  586.         if (x != '\0')
  587.             xprintf("%c%s ", x, m->m_name);
  588.         else
  589.             xprintf("%s ", m->m_name);
  590.         }
  591.     }
  592.     xprintf("\n");
  593.     return;
  594.     }
  595.     while (v && (s = *v++)) {
  596.     switch (*s) {
  597.     case '+':
  598.     case '-':
  599.         x = *s++;
  600.         break;
  601.     default:
  602.         x = '\0';
  603.         break;
  604.     }
  605.     d = short2str(s);
  606.     for (m = modelist; m->m_name; m++)
  607.         if (strcmp(m->m_name, d) == 0)
  608.         break;
  609.     if (!m->m_name) 
  610.         stderror(ERR_NAME | ERR_SYSTEM, d, "Invalid argument");
  611.  
  612.     switch (x) {
  613.     case '+':
  614.         ttylist[z][m->m_type].t_setmask |= m->m_value;
  615.         ttylist[z][m->m_type].t_clrmask &= ~m->m_value;
  616.         break;
  617.     case '-':
  618.         ttylist[z][m->m_type].t_setmask &= ~m->m_value;
  619.         ttylist[z][m->m_type].t_clrmask |= m->m_value;
  620.         break;
  621.     default:
  622.         ttylist[z][m->m_type].t_setmask &= ~m->m_value;
  623.         ttylist[z][m->m_type].t_clrmask &= ~m->m_value;
  624.         break;
  625.     }
  626.     }
  627. } /* end dosetty */
  628.  
  629.  
  630. int
  631. tty_getty(fd, td)
  632.    int fd;
  633.    ttydata_t *td;
  634. {
  635. #ifdef POSIX
  636.     if (tcgetattr(fd, &td->d_t) == -1)
  637.     return -1;
  638. #else /* TERMIO || GSTTY */
  639. # ifdef TERMIO
  640.     if (ioctl(fd, TCGETA,    (ioctl_t) &td->d_t) == -1)
  641.     return -1;
  642. # else /* GSTTY */
  643. #  ifdef TIOCGETP
  644.     if (ioctl(fd, TIOCGETP,  (ioctl_t) &td->d_t) == -1)
  645.     return -1;
  646. #  endif /* TIOCGETP */
  647. #  ifdef TIOCGETC
  648.     if (ioctl(fd, TIOCGETC,  (ioctl_t) &td->d_tc) == -1)
  649.     return -1;
  650. #  endif /* TIOCGETC */
  651. #  ifdef TIOCGPAGE
  652.     if (ioctl(fd, TIOCGPAGE, (ioctl_t) &td->d_pc) == -1)
  653.     return -1;
  654. #  endif /* TIOCGPAGE */
  655. #  ifdef TIOCLGET
  656.     if (ioctl(fd, TIOCLGET,  (ioctl_t) &td->d_lb) == -1)
  657.     return -1;
  658. #  endif /* TIOCLGET */
  659. # endif /* TERMIO */
  660. #endif /* POSIX */
  661.  
  662. #ifdef TIOCGLTC
  663.     if (ioctl(fd, TIOCGLTC,  (ioctl_t) &td->d_ltc) == -1)
  664.     return -1;
  665. #endif /* TIOCGLTC */
  666.  
  667.     return 0;
  668. }
  669.  
  670. int
  671. tty_setty(fd, td)
  672.    int fd;
  673.    ttydata_t *td;
  674. {
  675. #ifdef POSIX
  676.     if (tcsetattr(fd, TCSADRAIN, &td->d_t) == -1) 
  677.     return -1;
  678. #else
  679. # ifdef TERMIO
  680.     if (ioctl(fd, TCSETA,    (ioctl_t) &td->d_t) == -1)
  681.     return -1;
  682. # else
  683. #  ifdef TIOCSETN
  684.     if (ioctl(fd, TIOCSETN,  (ioctl_t) &td->d_t) == -1)
  685.     return -1;
  686. #  endif /* TIOCSETN */
  687. #  ifdef TIOCGETC
  688.     if (ioctl(fd, TIOCSETC,  (ioctl_t) &td->d_tc) == -1)
  689.     return -1;
  690. #  endif /* TIOCGETC */
  691. #  ifdef TIOCGPAGE
  692.     if (ioctl(fd, TIOCSPAGE, (ioctl_t) &td->d_pc) == -1)
  693.     return -1;
  694. #  endif /* TIOCGPAGE */
  695. #  ifdef TIOCLGET
  696.     if (ioctl(fd, TIOCLSET,  (ioctl_t) &td->d_lb) == -1)
  697.     return -1;
  698. #  endif /* TIOCLGET */
  699. # endif /* TERMIO */
  700. #endif /* POSIX */
  701.  
  702. #ifdef TIOCGLTC
  703.     if (ioctl(fd, TIOCSLTC,  (ioctl_t) &td->d_ltc) == -1)
  704.     return -1;
  705. #endif /* TIOCGLTC */
  706.  
  707.     return 0;
  708. }
  709.  
  710. void
  711. tty_getchar(td, s)
  712.     ttydata_t *td;
  713.     unsigned char *s;
  714. {   
  715. #ifdef TIOCGLTC
  716.     {
  717.     struct ltchars *n = &td->d_ltc;
  718.  
  719.     s[C_SUSP]    = n->t_suspc;
  720.     s[C_DSUSP]    = n->t_dsuspc;
  721.     s[C_REPRINT]    = n->t_rprntc;
  722.     s[C_DISCARD]    = n->t_flushc;
  723.     s[C_WERASE]    = n->t_werasc;
  724.     s[C_LNEXT]    = n->t_lnextc;
  725.     }
  726. #endif /* TIOCGLTC */
  727.  
  728. #if defined(POSIX) || defined(TERMIO)
  729.     {
  730. # ifdef POSIX
  731.     struct termios *n = &td->d_t;
  732. # else
  733.     struct termio *n = &td->d_t;
  734. # endif /* POSIX */
  735.  
  736. # ifdef VINTR
  737.     s[C_INTR]    = n->c_cc[VINTR];
  738. # endif /* VINTR */
  739. # ifdef VQUIT
  740.     s[C_QUIT]    = n->c_cc[VQUIT];
  741. # endif /* VQUIT */
  742. # ifdef VERASE
  743.     s[C_ERASE]    = n->c_cc[VERASE];
  744. # endif /* VERASE */
  745. # ifdef VKILL
  746.     s[C_KILL]    = n->c_cc[VKILL];
  747. # endif /* VKILL */
  748. # ifdef VEOF
  749.     s[C_EOF]    = n->c_cc[VEOF];
  750. # endif /* VEOF */
  751. # ifdef VEOL
  752.     s[C_EOL]    = n->c_cc[VEOL];
  753. # endif /* VEOL */
  754. # ifdef VEOL2
  755.     s[C_EOL2]    = n->c_cc[VEOL2];
  756. # endif  /* VEOL2 */
  757. # ifdef VSWTCH
  758.     s[C_SWTCH]    = n->c_cc[VSWTCH];
  759. # endif /* VSWTCH */
  760. # ifdef VDSWTCH
  761.     s[C_DSWTCH]    = n->c_cc[VDSWTCH];
  762. # endif /* VDSWTCH */
  763. # ifdef VERASE2
  764.     s[C_ERASE2]    = n->c_cc[VERASE2];
  765. # endif /* VERASE2 */
  766. # ifdef VSTART
  767.     s[C_START]    = n->c_cc[VSTART];
  768. # endif /* VSTART */
  769. # ifdef VSTOP
  770.     s[C_STOP]    = n->c_cc[VSTOP];
  771. # endif /* VSTOP */
  772. # ifdef VWERASE
  773.     s[C_WERASE]    = n->c_cc[VWERASE];
  774. # endif /* VWERASE */
  775. # ifdef VSUSP
  776.     s[C_SUSP]    = n->c_cc[VSUSP];
  777. # endif /* VSUSP */
  778. # ifdef VDSUSP
  779.     s[C_DSUSP]    = n->c_cc[VDSUSP];
  780. # endif /* VDSUSP */
  781. # ifdef VREPRINT
  782.     s[C_REPRINT]    = n->c_cc[VREPRINT];
  783. # endif /* WREPRINT */
  784. # ifdef VDISCARD
  785.     s[C_DISCARD]    = n->c_cc[VDISCARD];
  786. # endif /* VDISCARD */
  787. # ifdef VLNEXT
  788.     s[C_LNEXT]    = n->c_cc[VLNEXT];
  789. # endif /* VLNEXT */
  790. # ifdef VSTATUS
  791.     s[C_STATUS]    = n->c_cc[VSTATUS];
  792. # endif /* VSTATUS */
  793. # ifdef VPAGE
  794.     s[C_PAGE]    = n->c_cc[VPAGE];
  795. # endif /* VPAGE */
  796. # ifdef VPGOFF
  797.     s[C_PGOFF]    = n->c_cc[VPGOFF];
  798. # endif /* VPGOFF */
  799. # ifdef VKILL2
  800.     s[C_KILL2]    = n->c_cc[VKILL2];
  801. # endif /* KILL2 */
  802. # ifdef VMIN
  803.     s[C_MIN]    = n->c_cc[VMIN];
  804. # endif /* VMIN */
  805. # ifdef VTIME
  806.     s[C_TIME]    = n->c_cc[VTIME];
  807. # endif /* VTIME */
  808.     }
  809.  
  810. #else /* SGTTY */
  811.  
  812. # ifdef TIOCGPAGE
  813.     {
  814.     struct ttypagestat *n = &td->d_pc;
  815.  
  816.     s[C_STATUS]    = n->tps_statc;
  817.     s[C_PAGE]    = n->tps_pagec;
  818.     s[C_PGOFF]    = n->tps_pgoffc;
  819.     }
  820. # endif /* TIOCGPAGE */
  821.  
  822. # ifdef TIOCGETC
  823.     {
  824.     struct tchars *n = &td->d_tc;
  825.  
  826.     s[C_INTR]    = n->t_intrc;
  827.     s[C_QUIT]    = n->t_quitc;
  828.     s[C_START]    = n->t_startc;
  829.     s[C_STOP]    = n->t_stopc;
  830.     s[C_EOF]    = n->t_eofc;
  831.     s[C_BRK]    = n->t_brkc;
  832.     }
  833. # endif /* TIOCGETC */
  834.  
  835. # ifdef TIOCGETP
  836.     {
  837.     struct sgttyb *n = &td->d_t;
  838.  
  839.     s[C_ERASE]    = n->sg_erase;
  840.     s[C_KILL]    = n->sg_kill;
  841.     }
  842. # endif /* TIOCGETP */
  843. #endif /* !POSIX || TERMIO */
  844.  
  845. } /* tty_getchar */
  846.  
  847.  
  848. void
  849. tty_setchar(td, s)
  850.     ttydata_t *td;
  851.     unsigned char *s;
  852. {   
  853. #ifdef TIOCGLTC
  854.     {
  855.     struct ltchars *n = &td->d_ltc; 
  856.  
  857.     n->t_suspc         = s[C_SUSP];
  858.     n->t_dsuspc        = s[C_DSUSP];
  859.     n->t_rprntc        = s[C_REPRINT];
  860.     n->t_flushc        = s[C_DISCARD];
  861.     n->t_werasc        = s[C_WERASE];
  862.     n->t_lnextc        = s[C_LNEXT];
  863.     }
  864. #endif /* TIOCGLTC */
  865.  
  866. #if defined(POSIX) || defined(TERMIO)
  867.     {
  868. # ifdef POSIX
  869.     struct termios *n = &td->d_t;
  870. # else
  871.     struct termio *n = &td->d_t;
  872. # endif /* POSIX */
  873.  
  874. # ifdef VINTR
  875.     n->c_cc[VINTR]        = s[C_INTR];
  876. # endif /* VINTR */
  877. # ifdef VQUIT
  878.     n->c_cc[VQUIT]        = s[C_QUIT];
  879. # endif /* VQUIT */
  880. # ifdef VERASE
  881.     n->c_cc[VERASE]        = s[C_ERASE];
  882. # endif /* VERASE */
  883. # ifdef VKILL
  884.     n->c_cc[VKILL]        = s[C_KILL];
  885. # endif /* VKILL */
  886. # ifdef VEOF
  887.     n->c_cc[VEOF]        = s[C_EOF];
  888. # endif /* VEOF */
  889. # ifdef VEOL
  890.     n->c_cc[VEOL]        = s[C_EOL];
  891. # endif /* VEOL */
  892. # ifdef VEOL2
  893.     n->c_cc[VEOL2]        = s[C_EOL2];
  894. # endif  /* VEOL2 */
  895. # ifdef VSWTCH
  896.     n->c_cc[VSWTCH]        = s[C_SWTCH];
  897. # endif /* VSWTCH */
  898. # ifdef VDSWTCH
  899.     n->c_cc[VDSWTCH]    = s[C_DSWTCH];
  900. # endif /* VDSWTCH */
  901. # ifdef VERASE2
  902.     n->c_cc[VERASE2]    = s[C_ERASE2];
  903. # endif /* VERASE2 */
  904. # ifdef VSTART
  905.     n->c_cc[VSTART]        = s[C_START];
  906. # endif /* VSTART */
  907. # ifdef VSTOP
  908.     n->c_cc[VSTOP]        = s[C_STOP];
  909. # endif /* VSTOP */
  910. # ifdef VWERASE
  911.     n->c_cc[VWERASE]    = s[C_WERASE];
  912. # endif /* VWERASE */
  913. # ifdef VSUSP
  914.     n->c_cc[VSUSP]        = s[C_SUSP];
  915. # endif /* VSUSP */
  916. # ifdef VDSUSP
  917.     n->c_cc[VDSUSP]        = s[C_DSUSP];
  918. # endif /* VDSUSP */
  919. # ifdef VREPRINT
  920.     n->c_cc[VREPRINT]    = s[C_REPRINT];
  921. # endif /* WREPRINT */
  922. # ifdef VDISCARD
  923.     n->c_cc[VDISCARD]    = s[C_DISCARD];
  924. # endif /* VDISCARD */
  925. # ifdef VLNEXT
  926.     n->c_cc[VLNEXT]        = s[C_LNEXT];
  927. # endif /* VLNEXT */
  928. # ifdef VSTATUS
  929.     n->c_cc[VSTATUS]    = s[C_STATUS];
  930. # endif /* VSTATUS */
  931. # ifdef VPAGE
  932.     n->c_cc[VPAGE]        = s[C_PAGE];
  933. # endif /* VPAGE */
  934. # ifdef VPGOFF
  935.     n->c_cc[VPGOFF]        = s[C_PGOFF];
  936. # endif /* VPGOFF */
  937. # ifdef VKILL2
  938.     n->c_cc[VKILL2]        = s[C_KILL2];
  939. # endif /* VKILL2 */
  940. # ifdef VMIN
  941.     n->c_cc[VMIN]        = s[C_MIN];
  942. # endif /* VMIN */
  943. # ifdef VTIME
  944.     n->c_cc[VTIME]        = s[C_TIME];
  945. # endif /* VTIME */
  946.     }
  947.  
  948. #else /* GSTTY */
  949.  
  950. # ifdef TIOCGPAGE
  951.     {
  952.     struct ttypagestat *n = &td->d_pc;
  953.  
  954.     n->tps_length        = 0;
  955.     n->tps_lpos        = 0;
  956.     n->tps_statc        = s[C_STATUS];
  957.     n->tps_pagec        = s[C_PAGE];
  958.     n->tps_pgoffc        = s[C_PGOFF];
  959.     n->tps_flag        = 0;
  960.     }
  961. # endif /* TIOCGPAGE */
  962.  
  963. # ifdef TIOCGETC
  964.     {
  965.     struct tchars *n = &td->d_tc;
  966.     n->t_intrc        = s[C_INTR];
  967.     n->t_quitc        = s[C_QUIT];
  968.     n->t_startc        = s[C_START];
  969.     n->t_stopc        = s[C_STOP];
  970.     n->t_eofc        = s[C_EOF];
  971.     n->t_brkc        = s[C_BRK];
  972.     }
  973. # endif /* TIOCGETC */
  974.  
  975. # ifdef TIOCGETP
  976.     {
  977.     struct sgttyb *n = &td->d_t;
  978.  
  979.     n->sg_erase        = s[C_ERASE];
  980.     n->sg_kill        = s[C_KILL];
  981.     }
  982. # endif /* TIOCGETP */
  983. #endif /* !POSIX || TERMIO */
  984.  
  985. } /* tty_setchar */
  986.  
  987. speed_t
  988. tty_getspeed(td)
  989.     ttydata_t *td;
  990. {
  991.     speed_t spd;
  992.  
  993. #ifdef POSIX
  994.     if ((spd = cfgetispeed(&td->d_t)) == 0)
  995.     spd = cfgetospeed(&td->d_t);
  996. #else /* ! POSIX */
  997. # ifdef TERMIO
  998. #  ifdef CBAUD
  999.     spd = td->d_t.c_cflag & CBAUD;
  1000. #  else 
  1001.     spd = 0;
  1002. #  endif 
  1003. # else /* SGTTY */
  1004.     spd = td->d_t.sg_ispeed;
  1005. # endif /* TERMIO */
  1006. #endif /* POSIX */
  1007.  
  1008.     return spd;
  1009. } /* end tty_getspeed */
  1010.  
  1011. int
  1012. tty_gettabs(td)
  1013.     ttydata_t *td;
  1014. {
  1015. #if defined(POSIX) || defined(TERMIO)
  1016.     return ((td->d_t.c_oflag & TAB3) == TAB3) ? 0 : 1;
  1017. #else /* SGTTY */
  1018.     return (td->d_t.sg_flags & XTABS) == XTABS ? 0 : 1;
  1019. #endif /* POSIX || TERMIO */
  1020. } /* end tty_gettabs */
  1021.  
  1022. int
  1023. tty_geteightbit(td)
  1024.     ttydata_t *td;
  1025. {
  1026. #if defined(POSIX) || defined(TERMIO)
  1027.     return (td->d_t.c_cflag & CSIZE) == CS8;
  1028. #else /* SGTTY */
  1029.     return td->d_lb & (LPASS8 | LLITOUT);
  1030. #endif /* POSIX || TERMIO */
  1031. } /* end tty_geteightbit */
  1032.  
  1033. int
  1034. tty_cooked_mode(td)
  1035.     ttydata_t *td;
  1036. {
  1037. #if defined(POSIX) || defined(TERMIO)
  1038.     return (td->d_t.c_lflag & ICANON);
  1039. #else /* SGTTY */
  1040.     return !(td->d_t.sg_flags & (RAW | CBREAK));
  1041. #endif /* POSIX || TERMIO */
  1042. } /* end tty_cooked_mode */
  1043.  
  1044. #ifdef _IBMR2
  1045. void
  1046. tty_setdisc(fd, dis)
  1047.     int fd;
  1048.     int dis;
  1049. {
  1050.     static bool edit_discipline = 0;
  1051.     static union txname tx_disc;
  1052.     extern char strPOSIX[];
  1053.  
  1054.     switch (dis) {
  1055.     case EX_IO:
  1056.     if (edit_discipline) {
  1057.         if (ioctl(fd, TXSETLD, (ioctl_t) & tx_disc) == -1)
  1058.         return;
  1059.         edit_discipline = 0;
  1060.     }
  1061.     return;
  1062.  
  1063.     case ED_IO:
  1064.     tx_disc.tx_which = 0;
  1065.     if (ioctl(fd, TXGETLD, (ioctl_t) & tx_disc) == -1)
  1066.         return;
  1067.     if (strcmp(tx_disc.tx_name, strPOSIX) != 0) {
  1068.         edit_discipline = 1;
  1069.         if (ioctl(fd, TXSETLD, (ioctl_t) strPOSIX) == -1)
  1070.         return;
  1071.     }
  1072.     return;
  1073.  
  1074.     default:
  1075.     return;
  1076.     }
  1077. } /* end tty_setdisc */
  1078. #endif /* _IBMR2 */
  1079.  
  1080. #ifdef DEBUG_TTY
  1081. static void
  1082. tty_printchar(s)
  1083.     unsigned char *s;
  1084. {
  1085.     struct tcshmodes *m;
  1086.     int i;
  1087.  
  1088.     for (i = 0; i < C_NCC; i++) {
  1089.     for (m = modelist; m->m_name; m++) 
  1090.         if (m->m_type == M_CHAR && C_SH(i) == m->m_value)
  1091.         break;
  1092.     if (m->m_name)
  1093.         xprintf("%s ^%c ", m->m_name, s[i] + 'A' - 1);
  1094.     if (i % 5 == 0)
  1095.         xprintf("\n");
  1096.     }
  1097.     xprintf("\n"); 
  1098. }
  1099. #endif /* DEBUG_TTY */
  1100.